package com.yic.module.mes.service.plan;

import java.math.BigDecimal;
import java.util.*;
import javax.validation.*;
import com.yic.module.mes.controller.admin.plan.vo.*;
import com.yic.module.mes.dal.dataobject.plan.PlanDO;
import com.yic.framework.common.pojo.PageResult;

/**
 * 生产计划 Service 接口
 *
 * @author 系统管理员
 */
public interface PlanService {

    /**
     * 创建生产计划
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createPlan(@Valid PlanCreateReqVO createReqVO);

    /**
     * 同步生产计划
     * @param syncReqVO
     * @return
     */
    Long syncPlan(PlanSyncReqVO syncReqVO);

    /**
     * 更新生产计划
     *
     * @param updateReqVO 更新信息
     */
    void updatePlan(@Valid PlanUpdateReqVO updateReqVO);

    void batchUpdatePlan(Collection<PlanDO> planDOS);

    /**
     * 删除生产计划
     *
     * @param id 编号
     */
    void deletePlan(Long id);

    /**
     * 删除生产计划
     * @param code
     */
    void deletePlan(String code);

    /**
     * 获得生产计划
     *
     * @param id 编号
     * @return 生产计划
     */
    PlanDO getPlan(Long id);

    /**
     * 获得生产计划列表
     *
     * @param ids 编号
     * @return 生产计划列表
     */
    List<PlanDO> getPlanList(Collection<Long> ids);

    /**
     * 获得生产计划分页
     *
     * @param pageReqVO 分页查询
     * @return 生产计划分页
     */
    PageResult<PlanDO> getPlanPage(PlanPageReqVO pageReqVO);

    /**
     * 获得生产计划列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 生产计划列表
     */
    List<PlanDO> getPlanList(PlanExportReqVO exportReqVO);

    /**
     * 变更生产计划数量信息
     * @param planId
     * @param produceAmount
     * @param reportAmount
     * @param inAmount
     */
    void changeAmount(Long planId, BigDecimal produceAmount, BigDecimal reportAmount, BigDecimal inAmount);

    /**
     * 校验产品是否已经产生生产计划
     * @param id
     * @return
     */
    Boolean checkItemUsed(Long id);



}
